"""
A Styles is a collection of PropertySets that can be applied to a particular RTF element.

At present there are only two, Text and Paragraph but ListStyles will be added soon too.
"""

from PropertySets import *

class TextStyle:
    def __init__(self, textProps, name=None, shading_props=None):
        self.textProps = textProps
        self.name = name
        self.SetShadingPropertySet(shading_props)

    def Copy(self):
        return deepcopy(self)

    def SetShadingPropertySet(self, value):
        assert value is None or isinstance(value, ShadingPropertySet)
        self.ShadingPropertySet = value or ShadingPropertySet()
        return self

class ParagraphStyle:
    def __init__(self, name, text_style, paragraph_props=None, frame_props=None, shading_props=None):

        #    A style must have Font and a Font Size but the Text property set doesn't
        #    make these mandatory so that they can be used for overrides so at this point
        #    we need to make sure that that we have these values set
        if not text_style.textProps.font:
            raise Exception('Paragraph Styles must have a Font specified.')
        if not text_style.textProps.size:
            raise Exception('Paragraph Styles must have a Font Size specified.')
        self.name = name
        self.SetTextStyle(text_style)
        self.SetParagraphPropertySet(paragraph_props)
        self.SetFramePropertySet(frame_props)
        self.SetShadingPropertySet(shading_props)
        self.SetBasedOn(None)
        self.SetNext(None)

    def Copy(self):
        return deepcopy(self)

    def SetTextStyle(self, value):
        assert isinstance(value, TextStyle)
        self.TextStyle = value
        return self

    def SetParagraphPropertySet(self, value):
        assert value is None or isinstance(value, ParagraphPropertySet)
        self.ParagraphPropertySet = value or ParagraphPropertySet()
        return self

    def SetFramePropertySet(self, value):
        assert value is None or isinstance(value, FramePropertySet)
        self.FramePropertySet = value or FramePropertySet()
        return self

    def SetShadingPropertySet(self, value):
        """Set the background shading for the paragraph."""

        assert value is None or isinstance(value, ShadingPropertySet)
        self.ShadingPropertySet = value or ShadingPropertySet()
        return self

    def SetBasedOn(self, value):
        """Set the Paragraph Style that this one is based on."""

        assert not value or isinstance(value, ParagraphStyle)
        self.BasedOn = value
        return self

    def SetNext(self, value):
        """Set the Paragraph Style that should follow this one."""

        assert not value or isinstance(value, ParagraphStyle)
        self.Next    = value
        return self
